﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using Website.Logger;
using DAL;
using BOL;
using WebLib;
using EstandarControl;
using System.Web.Script.Services;
using System.Web.Services;
using System.IO;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using UtilityExtensions;

namespace UILGestion.ObraAdmin.OrdenCompras
{
    public partial class GastoObraEditForm : System.Web.UI.Page
    {
        public GastoObraEditForm()
        {
            bol = new OrdenCompraBL();
            ORDENCOMPRAITEMINFO = "OrdenCompraItemInfo";
            _db = new dbGestionDataContext(Parametros.strConnString);
        }

        private OrdenCompraBL bol;
        private dbGestionDataContext _db;
        private string ORDENCOMPRAITEMINFO;


        [WebMethod(), ScriptMethod()]
        public static string GetInsumo(String prefixText, String contextKey)
        {

            InsumoBL bol = new InsumoBL();
            return bol.getInsumoAll(prefixText, 30);

        }


        [WebMethod(), ScriptMethod()]
        public static string GetProveedor(String prefixText, String contextKey)
        {
            ProveedorBL bol = new ProveedorBL();
            return bol.getProveedorAll(prefixText, 20);
        }
        private void resetEmpty()
        {
            if (itemGridView.Rows.Count == 0)
            {
                List<OrdenCompraItemInfo> itemList0 = new List<OrdenCompraItemInfo>();
                OrdenCompraItemInfo itemcero = new OrdenCompraItemInfo();
                itemcero.idInternal = 0;
                itemList0.Add(itemcero);
                itemGridView.DataSource = itemList0;
                itemGridView.DataBind();
                itemGridView.Rows[0].Visible = false;
            }

        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                try
                {

                    idObra.Value = (string)Request.QueryString["idObra"];
                    internalid.Value = (string)Request.QueryString["id"];
                    idComparativo.Value = (string)Request.QueryString["idComparativo"];
                    type.Value = (string)Request.QueryString["type"];
                    if (type.Value == "") { type.Value = "A"; }
                    menuObraCtrl1.loadMenu(int.Parse(idObra.Value), Request.AppRelativeCurrentExecutionFilePath);


                    FormatForm();
                }
                catch (SqlException sqlex)
                {
                    WebServerSideSqlError.Log(sqlex);
                    ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


                }
                catch (Exception ex)
                {
                    WebServerSideError.Log(ex);
                    ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

                }

            }
        }





        private void LoadOrdenCompra(OrdenCompra ordenCompra)
        {


            numDocumentoLabel.Text = ordenCompra.numDocumento;
            fechaTextBox.Text = ordenCompra.fechaEmision.Value.ToShortDateString();

            comparativoDDL.Enabled = false;


            simbol.Value = ordenCompra.Moneda1.simbol;


            ProveedorTXT.Text = ordenCompra.Proveedor1.descripcion;
            idproveedorTXT.Text = ordenCompra.idProveedor.ToString();
            rucTXT.Text = ordenCompra.Proveedor1.ruc;
            contactoTXT.Text = ordenCompra.Proveedor1.contacto;
            formaPagoDDL.SelectedValue = ordenCompra.idFormaPago.ToString();
            estructuraDDL.SelectedValue = ordenCompra.idEstructuraCompras.ToString();
            monedaDDL.SelectedValue = ordenCompra.idMoneda.ToString();
            tipoCambioLabel.Text = ordenCompra.tipoCambio.ToString();
            centroCostoLabel.Text = ordenCompra.centroCosto;
            
            observacionTextBox.Text = ordenCompra.observaciones;
            centroCostoLabel.Text = ordenCompra.centroCosto;


            subTotalTextBox.Text = ordenCompra.subTotal.Value.ToString("N2");
            IGVLabel.Text = ordenCompra.IGVTotal.Value.ToString("N2");
            totalLabel.Text = ordenCompra.total.Value.ToString("N2");



            atencionLabel.Text = ordenCompra.Obra.responsableEntrega;
            direccionComprabanteLabel.Text = ordenCompra.Obra.direccionFacturacion;
            direccionEntregaLabel.Text = ordenCompra.Obra.direcccionEntrega;

            IGVCheckBox.Checked = ordenCompra.Obra.incluyeIGV.Value;




            comparativoLinkButton.Text = (ordenCompra.idComparativo != null) ? ordenCompra.Comparativo.numDocumento : "";
            comparativoLinkButton.NavigateUrl = (ordenCompra.idComparativo != null) ?
                "../Comparativos/ComparativoReadForm.aspx?idObra={0}&id={1}".Fmt(ordenCompra.idObra, ordenCompra.idComparativo) :
                "";

            AddRecursos.Visible = false;
            if (ordenCompra.idComparativo != null)
            {
                SaldoComparativoLabel.Text = string.Format("{0} {1:N}", ordenCompra.Moneda1.simbol,
                                            (ordenCompra.ComparativoProveedor.totalContratado.Value -
                                            ordenCompra.ComparativoProveedor.totalUso.Value).ToString("N"));
                AddRecursos.Visible = true;

            }



            CalcularIGVCheckBox.Checked = true;
            tipoGastoDropDown.SelectedValue = "2"; //por dafault
            CalcularIGVCheckBox.Visible = true;
            calcularIGVLabel.Visible = true;


            DataTable empleadoObraList = Util.EntidadToDataTable(bol.getOrdenCompraItem(DbUtil.Db, int.Parse(internalid.Value)));
            DataSet ds = new DataSet();


            empleadoObraList.TableName = ORDENCOMPRAITEMINFO;


            ds.Tables.Add(empleadoObraList);
            ds.AcceptChanges();

            Session[idobjectdsLabel.Value] = ds;
        }


        private void verificarTipoCambio()
        {

            //(DD/MM/yyyy)
            System.IFormatProvider MiFp =
                new System.Globalization.CultureInfo("es-ES", false);

            DateTime dt = DateTime.ParseExact(fechaTextBox.Text, "dd/MM/yyyy", MiFp);




            Moneda moneda = DbUtil.Db.Monedas.Single(p => p.idInternal == int.Parse(monedaDDL.SelectedValue));
            tipoCambioLabel.Text = moneda.getTipoCambio(DbUtil.Db, dt).ToString();

        }

        private void ShowAllComboBox()
        {
            var listas = new ListValueBL();

            formaPagoDDL.DataValueField = "idInternal";
            formaPagoDDL.DataTextField = "descripcion";
            formaPagoDDL.DataSource = listas.GetFormaPago();
            formaPagoDDL.DataBind();

            estructuraDDL.DataValueField = "idInternal";
            estructuraDDL.DataTextField = "descripcion";
            estructuraDDL.DataSource = listas.GetEstructuraCompras(idObra.Value.ToInt());
            estructuraDDL.DataBind();

            estructuraDDL.DataBind();

            monedaDDL.DataValueField = "idInternal";
            monedaDDL.DataTextField = "descripcion";
            monedaDDL.DataSource = listas.GetMoneda();
            monedaDDL.DataBind();

            comparativoDDL.Items.Clear();



            List<ListValueInfo> cL = new List<ListValueInfo>();
            ListValueInfo comparativocero = new ListValueInfo();
            comparativocero.descripcion = "------Orden Compra Sin Comparativo---------";
            comparativocero.idInternal = 0;

            cL.Add(comparativocero);
            cL.AddRange(listas.GetComparativosDispToOrdenGastoList(int.Parse(idObra.Value)));

            comparativoDDL.DataTextField = "descripcion";
            comparativoDDL.DataValueField = "idInternal";

            comparativoDDL.DataSource = cL;
            comparativoDDL.DataBind();


            tipoGastoDropDown.DataTextField = "descripcion";
            tipoGastoDropDown.DataValueField = "idInternal";
            tipoGastoDropDown.DataSource = listas.GetTipoOrdenGasto();
            tipoGastoDropDown.DataBind();


            GrupoDatoitem IGV = _db.GrupoDatoitems.Single(p => p.idInternal == 10);
            Obra obra = _db.Obras.Single(p => p.idInternal == int.Parse(idObra.Value));


            atencionLabel.Text = obra.responsableEntrega;
            direccionComprabanteLabel.Text = obra.direccionFacturacion;
            direccionEntregaLabel.Text = obra.direcccionEntrega;


            IGVCheckBox.Checked = obra.incluyeIGV.Value;
            IGVvalorLabel.Text = IGV.descripcion;



            cajaChicaDDL.DataTextField = "descripcion";
            cajaChicaDDL.DataValueField = "idInternal";
            cajaChicaDDL.DataSource = new ListValueBL().GetCajaChicaPendientes(idObra.Value.ToInt());
            cajaChicaDDL.DataBind();

        }

        private void FormatForm()
        {
            //--------------------
            int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
            bool acceso = new DAL.FormularioAcceso().VerificarAcceso(DbUtil.Db,
                idEmpleadoEmisor,
                3, //orden Compra
                int.Parse(idObra.Value),
                2); //lectura
            //------------------------- 
            // los paneles presentes en el formulario
            pnlMain.Visible = true;
            PanelBody.Visible = true;
            PanelButtom.Visible = true;

            //-----------------------------
            fechaTextBox.Text = DateTime.Now.ToShortDateString();
            //fechaEntregaTextBox.Text = DateTime.Now.ToShortDateString();
            //fechaContratoTextBox.Text = DateTime.Now.ToShortDateString();

            idobjectdsLabel.Value = Parametros.GenerarID().ToString();
            ShowAllComboBox();

            if (type.Value == "E")
            {
                OrdenCompra ordenCompra = DbUtil.Db.OrdenCompras.Single(p => p.idInternal == internalid.Value.ToInt());
                LoadOrdenCompra(ordenCompra);
                verificarTipoCambio();

                BindDataitem();
                SetTotales();

            }
            else
            {
                rendicionCHPNL.Visible = false;
                comparativoDDL.SelectedValue = idComparativo.Value;
                loadCombo();
                verificarTipoCambio();

            }

            string idEC = (string)Request.QueryString["idEC"];
            if (idEC.HasValue())
            {
                estructuraDDL.SelectedValue = idEC;
            }



        }

        private void ClearControl()
        {
            Activarcontrol(true);
            //mostrar controles de agregacion
            ProveedorTXT.Text = string.Empty;
            idproveedorTXT.Text = string.Empty;
            contactoTXT.Text = string.Empty;
            rucTXT.Text = string.Empty;
            comparativoLinkButton.Text = string.Empty;
            SaldoComparativoLabel.Text = string.Empty;

            DataTable dtList = Util.EntidadToDataTable(bol.getOrdenCompraItem(DbUtil.Db, internalid.Value.ToInt()));
            DataSet ds = new DataSet();

            dtList.TableName = ORDENCOMPRAITEMINFO;


            ds.Tables.Add(dtList);
            ds.AcceptChanges();

            Session[idobjectdsLabel.Value] = ds;
        }

        private void Activarcontrol(bool activar)
        {
            //ProveedorTXT.Enabled = activar;
            contactoTXT.Enabled = activar;
            formaPagoDDL.Enabled = activar;
            estructuraDDL.Enabled = activar;
            monedaDDL.Enabled = activar;
        }


        protected void btnSaveContinue_Click(object sender, EventArgs e)
        {
            System.IFormatProvider MiFp = new System.Globalization.CultureInfo("es-ES", false);
            try
            {
                if ((sender as System.Web.UI.WebControls.Button).Text == cancelarButton.Text)
                {
                    Response.Redirect("GastoObraListForm.aspx?idObra=" + idObra.Value, true);
                }

                if ((sender as System.Web.UI.WebControls.Button).Text == saveButton.Text)
                {
                    // generar un  dataset para enviar al presupuesto;
                    DataSet dsRecurso = (DataSet)Session[idobjectdsLabel.Value.ToString()];
                    OrdenCompraBL bol = new OrdenCompraBL();
                    if (type.Value == "E")
                    {
                        //bol.UpdateCompra(internalid.Value.ToInt(),
                        //                      idproveedorTXT.Text.ToInt(),
                        //                      fechaTextBox.Text.ToDate().Value,
                        //                      fechaContratoTextBox.Text.ToDate().Value,
                        //                      fechaEntregaTextBox.Text.ToDate().Value,
                        //                      formaPagoDDL.SelectedValue.ToInt(),
                        //                      decimal.Parse(tipoCambioLabel.Text),
                        //                      monedaDDL.SelectedValue.ToInt(),
                        //                      monedaDDL.SelectedItem.Text,
                        //                      idComparativo.Value.ToInt()!=0?idComparativo.Value.ToInt2():null,
                        //                      IGVCheckBox.Checked,
                        //                      decimal.Parse(IGVvalorLabel.Text) / 100,
                        //                      observacionTextBox.Text,
                        //                      centroCostoLabel.Text,
                        //                      estructuraDDL.SelectedItem.Text,
                        //                      estructuraDDL.SelectedValue.ToInt(),

                        //                     direccionEntregaLabel.Text,
                        //                     atencionLabel.Text,
                        //                     direccionComprabanteLabel.Text,
                        //                     bitAnticipoChk.Checked,
                        //                     dsRecurso
                        //                     );
                    }
                    if (type.Value == "A")
                    {

                        int? idComparativo = comparativoDDL.SelectedValue.ToInt();
                        int? idRendicion = cajaChicaDDL.SelectedValue.ToInt();

                        internalid.Value = bol.addGasto( _db,
                         tipoGastoDropDown.SelectedValue.ToInt(),
                         idComparativo == 0 ? null : idComparativo,
                         idRendicion == 0 ? null : idRendicion,
                         idComparativoProveedor.Value.ToInt2(),
                         DateTime.ParseExact(fechaTextBox.Text, "dd/MM/yyyy", MiFp),

                         DateTime.ParseExact(fechaTextBox.Text, "dd/MM/yyyy", MiFp),
                         idproveedorTXT.Text.ToInt(),
                         formaPagoDDL.SelectedValue.ToInt(),
                       
                         monedaDDL.SelectedValue.ToInt(),
                         monedaDDL.SelectedItem.Text,
                         estructuraDDL.SelectedValue.ToInt(),
                         IGVCheckBox.Checked,
                         decimal.Parse(IGVvalorLabel.Text) / 100,
                         observacionTextBox.Text,
                         int.Parse(idObra.Value),
                         CalcularIGVCheckBox.Checked,
                         observacionTextBox.Text,
                         dsRecurso).ToString();


                    }
                    Session[idobjectdsLabel.Value.ToString()] = null;

                    Response.Redirect("GastoObraReadForm.aspx?idObra=" + idObra.Value + "&id=" + internalid.Value.ToString(), true);


                }

                if ((sender as System.Web.UI.WebControls.Button).Text == "Cancelar")
                {
                    //     ds = (DataSet)Session[idobjectdsLabel.Text.ToString()];
                    //     ds.RejectChanges();

                    string script = "<script languaje=\"javascript\">" +
               "window.close();" +
               "</script>";
                    ClientScript.RegisterStartupScript(
                        this.GetType(), "Registro Aceptacion", script);


                }

            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }




        }
        protected void refreshButton_Click(object sender, EventArgs e)
        {
            try
            {
                FormatForm();
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
        }
        #region "item"

        protected void AddItem(object sender, EventArgs e)
        {
            try
            {

                decimal IGVvalor = decimal.Parse(IGVvalorLabel.Text);

                TextBox codigoTXT = ((TextBox)itemGridView.FooterRow.FindControl("codigoTXT"));
                TextBox cantidadTextBox = ((TextBox)itemGridView.FooterRow.FindControl("cantidadInsertTextBox"));
                TextBox precioIGVETextBox = ((TextBox)itemGridView.FooterRow.FindControl("precioIGVInsertTextBox"));
                TextBox precioTextBox = ((TextBox)itemGridView.FooterRow.FindControl("precioInsertTextBox"));
                TextBox subMontoTextBox = ((TextBox)itemGridView.FooterRow.FindControl("subMontoInsertTextBox"));
                TextBox subMontoIGVTextBox = ((TextBox)itemGridView.FooterRow.FindControl("subMontoIGVInsertTextBox"));

                DAL.Insumo insumo = DbUtil.Db.Insumos.SingleOrDefault(p => p.codigo == codigoTXT.Text.Trim());
               if (insumo== null) {throw  new Exception("No existe Insumo Verifique");};

                DataSet lista = (DataSet)Session[idobjectdsLabel.Value];

                ////si incluye iGV
                //if (!IGVCheckBox.Checked)
                //{
                //    decimal subTotalIGV = subMontoTextBox.Text.ToDecimal().Value * (1 + (IGVvalor / 100));
                //    //calculamos los que quedan
                //    precioIGVETextBox.Text = (subTotalIGV / cantidadTextBox.Text.ToDecimal().Value).ToString();
                //    subMontoIGVTextBox.Text = subTotalIGV.ToString();
                //}
                //else
                //{
                //    decimal subTotal = subMontoIGVTextBox.Text.ToDecimal().Value / (1 + IGVvalor / 100);
                //    //calculamos los que quedan
                //    precioTextBox.Text = (subTotal / cantidadTextBox.Text.ToDecimal().Value).ToString();
                //    subMontoTextBox.Text = subTotal.ToString();
                //}

                //var ordenCompraItemInfo = new OrdenCompraItemInfo(Parametros.GenerarID(),
                //                                                  insumo.idInternal,
                //                                                  0,
                //                                                  insumo.descripcion,
                //                                                  insumo.InsumoUnidad.abreviacion,
                //                                                  insumo.codigo,
                //                                                  0,
                //                                                  true,
                //                                                  cantidadTextBox.Text.ToDecimal().Value,
                //                                                  subMontoTextBox.Text.ToDecimal().Value,
                //                                                  subMontoIGVTextBox.Text.ToDecimal().Value,
                //                                                  precioIGVETextBox.Text.ToDecimal().Value,
                //                                                  precioTextBox.Text.ToDecimal().Value,
                //                                                  IGVvalor,
                //                                                  0);

                var ordenCompraItemInfo = bol.GetOrdenCompraItemFromValor(_db,insumo.idInternal,
                                                                    cantidadTextBox.Text.ToDecimal().Value,
                                                                     IGVvalor,
                                                                     IGVCheckBox.Checked,
                                                                     CalcularIGVCheckBox.Checked,
                                                                     IGVCheckBox.Checked == true ? precioIGVETextBox.Text.ToDecimal().Value :
                                                                                                precioTextBox.Text.ToDecimal().Value,
                                                                     IGVCheckBox.Checked == true ? subMontoIGVTextBox.Text.ToDecimal().Value :
                                                                                                subMontoTextBox.Text.ToDecimal().Value);


                lista.Tables[ORDENCOMPRAITEMINFO].ImportRow(Util.EntidadToDataRow(ordenCompraItemInfo));
                Session[idobjectdsLabel.Value.ToString()] = lista;

                BindDataitem();
                SetTotales();

            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }

        }


        private void SetTotales()
        {
            totalLabel.Text = String.Format("{0} {1:N}", simbol.Value, 0m);
            IGVLabel.Text = String.Format("{0} {1:N}", simbol.Value, 0m);
            subTotalTextBox.Text = String.Format("{0} {1:N}", simbol.Value, 0m);

            DataSet OCI = (DataSet)Session[idobjectdsLabel.Value];
            var row = OCI.Tables[ORDENCOMPRAITEMINFO].AsEnumerable().Where(p => p.RowState != DataRowState.Deleted);

            bool obraIncluyeIGV = IGVCheckBox.Checked;
            decimal IGVProc = IGVvalorLabel.Text.ToDecimal().Value;
            decimal IGV = 1 + IGVProc / 100;

            if (row.Count() > 0)
            {
                foreach (var item in row)
                {


                    if (!obraIncluyeIGV)
                    {
                        if (CalcularIGVCheckBox.Checked)
                        {
                            item["subMonto"] = item.Field<decimal>("precioNoIGV") * item.Field<decimal>("cantidad");
                            item["subMontoIGV"] = item.Field<decimal>("subMonto") * IGV;
                            item["IGVItem"] = item.Field<decimal>("subMontoIGV") - item.Field<decimal>("subMonto");

                        }
                        else
                        {
                            item["subMonto"] = item.Field<decimal>("precioNoIGV") * item.Field<decimal>("cantidad");
                            item["IGVItem"] = 0;
                            item["subMontoIGV"] = item.Field<decimal>("subMonto") - item.Field<decimal>("IGVItem");
                        }
                    }
                    else
                    {
                        if (CalcularIGVCheckBox.Checked)
                        {
                            item["subMontoIGV"] = item.Field<decimal>("precioInclIGV") * item.Field<decimal>("cantidad");
                            item["subMonto"] = item.Field<decimal>("subMontoIGV") / IGV;
                            item["IGVItem"] = item.Field<decimal>("subMontoIGV") - item.Field<decimal>("subMonto");

                        }
                        else
                        {
                            item["subMontoIGV"] = item.Field<decimal>("precioInclIGV") * item.Field<decimal>("cantidad");
                            item["IGVItem"] = 0;
                            item["subMonto"] = item.Field<decimal>("subMontoIGV") - item.Field<decimal>("IGVItem");

                        }
                    }

                }

                totalLabel.Text = string.Format("{0} {1:N}",
                    simbol.Value,
                    row.Sum(p => p.Field<decimal>("subMontoIGV")));
                IGVLabel.Text = String.Format("{0} {1:N}",
                    simbol.Value,
                    row.Sum(p => p.Field<decimal>("IGVItem")));
                subTotalTextBox.Text = String.Format("{0} {1:N}",
                    simbol.Value,
                    row.Sum(p => p.Field<decimal>("subMonto")));
            }

            panelTotal.Update();
        }


        //private void SetTotales()
        //{

        //    List<OrdenCompraItemInfo> OCI = (List<OrdenCompraItemInfo>)Session[idobjectdsLabel.Value];
        //    //de acuerdo  a la obra  si incluye ono IGV
        //    bool obraIncluyeIGV = IGVCheckBox.Checked;
        //    decimal IGVProc = IGVvalorLabel.Text.ToDecimal().Value;
        //    decimal IGV = 1 + IGVProc / 100;
        //    foreach (var item in OCI)
        //    {
        //        //base
        //        //item.precioInclIGV=
        //        //  item.precioInclIGV=

        //        if (!obraIncluyeIGV)
        //        {
        //            if (CalcularIGVCheckBox.Checked)
        //            {
        //                item.subMonto = item.precioNoIGV * item.cantidad;

        //                item.subMontoIGV = item.subMonto * IGV;
        //                item.IGVItem = item.subMontoIGV - item.subMonto;

        //            }
        //            else
        //            {
        //                item.subMonto = item.precioNoIGV * item.cantidad;
        //                item.IGVItem = 0;
        //                item.subMontoIGV = item.subMonto - item.IGVItem;
        //            }
        //        }
        //        else
        //        {
        //            if (CalcularIGVCheckBox.Checked)
        //            {
        //                item.subMontoIGV = item.precioInclIGV * item.cantidad;
        //                item.subMonto = item.subMontoIGV / IGV;
        //                item.IGVItem = item.subMontoIGV - item.subMonto;

        //            }
        //            else
        //            {
        //                item.subMontoIGV = item.precioInclIGV * item.cantidad;
        //                item.IGVItem = 0;
        //                item.subMonto = item.subMontoIGV - item.IGVItem;

        //            }
        //        }

        //    }

        //    //sumamos segun lo que se tiene en items

        //    totalLabel.Text = OCI.Sum(p => p.subMontoIGV).ToString("N");
        //    IGVLabel.Text = OCI.Sum(p => p.IGVItem).ToString("N");
        //    subTotalTextBox.Text = OCI.Sum(p => p.subMonto).ToString("N");
        //    panelTotal.Update();




        //}


        private void SetEditItem(int i)
        {
            //cargamos los valores de disponible/combos

            //int idInternal = ((GridView)itemGridView).DataKeys[i].Values[0].ToInt();
            //TextBox cantidadDispTextBox = ((TextBox)itemGridView.Rows[i].FindControl("cantidadDispTextBox"));
            //TextBox subMontoDispEditTextBox = ((TextBox)itemGridView.Rows[i].FindControl("subMontoDispEditTextBox"));
            //TextBox subMontoIGVDispEditTextBox = ((TextBox)itemGridView.Rows[i].FindControl("subMontoIGVDispEditTextBox"));

            //OrdenCompraItem ocitem = DbUtil.Db.OrdenCompraItems.Single(p => p.idInternal == idInternal);

            //cantidadDispTextBox.Text = ocitem.GetCantidadDispWithOUT(DbUtil.Db).ToString("N");
            //subMontoDispEditTextBox.Text = ocitem.GetMontoDispNOIGVIGVWithOUT(DbUtil.Db).ToString("N");
            //subMontoIGVDispEditTextBox.Text = ocitem.GetMontoDispINCLIGVWithOUT(DbUtil.Db).ToString("N");

        }

        protected void Deleteitem(object sender, EventArgs e)
        {
            try
            {

                System.Web.UI.WebControls.ImageButton lnkRemove = (System.Web.UI.WebControls.ImageButton)sender;
                DataSet lista =
                        (DataSet)Session[idobjectdsLabel.Value];

                var dataRow = (from a in lista.Tables[ORDENCOMPRAITEMINFO].AsEnumerable().Where(p => p.RowState != DataRowState.Deleted)
                               where a.Field<int>("idInternal") == int.Parse(lnkRemove.CommandArgument.ToString())
                               select a).First();

                dataRow.Delete();
                //eRolList.Tables[1].Rows.Remove(drw);

                Session[idobjectdsLabel.Value.ToString()] = lista;

                BindDataitem();
                SetTotales();

            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }

        }
        protected void EditItem(object sender, GridViewEditEventArgs e)
        {
            try
            {
                itemGridView.EditIndex = e.NewEditIndex;

                int parent_index = e.NewEditIndex;


                BindDataitem();
                SetEditItem(e.NewEditIndex);

                //itemGridView.FooterRow.Visible = false;

            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }

        }
        protected void OnPaging(object sender, GridViewPageEventArgs e)
        {
            //BindData();
            //GridView1.PageIndex = e.NewPageIndex;
            //GridView1.DataBind();
        }

        protected void CancelEditItem(object sender, GridViewCancelEditEventArgs e)
        {
            try
            {
                itemGridView.EditIndex = -1;
                BindDataitem();
                //itemGridView.FooterRow.Visible = true;
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }

        }
        protected void UpdateItem(object sender, GridViewUpdateEventArgs e)
        {
            try
            {
                decimal IGVvalor = decimal.Parse(IGVvalorLabel.Text);

                string idInternal = ((GridView)sender).DataKeys[e.RowIndex].Values[0].ToString();
                string descripcion = ((System.Web.UI.WebControls.TextBox)itemGridView.Rows[e.RowIndex].FindControl("descripcionEditTextBox")).Text;
                string cantidad = ((System.Web.UI.WebControls.TextBox)itemGridView.Rows[e.RowIndex].FindControl("cantidadEditTextBox")).Text;
                string precioIGV = ((System.Web.UI.WebControls.TextBox)itemGridView.Rows[e.RowIndex].FindControl("precioIGVEditTextBox")).Text;
                string precioNOIGV = ((System.Web.UI.WebControls.TextBox)itemGridView.Rows[e.RowIndex].FindControl("precioEditTextBox")).Text;

                string subMonto = ((System.Web.UI.WebControls.TextBox)itemGridView.Rows[e.RowIndex].FindControl("subMontoEditTextBox")).Text;
                string subMontoIGV = ((System.Web.UI.WebControls.TextBox)itemGridView.Rows[e.RowIndex].FindControl("subMontoIGVEditTextBox")).Text;

                DataSet lista =
               (DataSet)Session[idobjectdsLabel.Value];


                var dataRow = (from a in lista.Tables[ORDENCOMPRAITEMINFO].AsEnumerable().Where(p => p.RowState != DataRowState.Deleted)
                               where a.Field<int>("idInternal") == idInternal.ToInt()
                               select a).First();



                ////si incluye iGV
                //if (!IGVCheckBox.Checked)
                //{
                //    decimal subTotalIGV = subMontoTextBox.Text.ToDecimal().Value * (1 + (IGVvalor / 100));
                //    //calculamos los que quedan
                //    precioIGVETextBox.Text = (subTotalIGV / cantidadTextBox.Text.ToDecimal().Value).ToString();
                //    subMontoIGVTextBox.Text = subTotalIGV.ToString();
                //}
                //else
                //{
                //    decimal subTotal = subMontoIGVTextBox.Text.ToDecimal().Value / (1 + IGVvalor / 100);
                //    //calculamos los que quedan
                //    precioTextBox.Text = (subTotal / cantidadTextBox.Text.ToDecimal().Value).ToString();
                //    subMontoTextBox.Text = subTotal.ToString();
                //}


                OrdenCompraItemInfo item =

                    (OrdenCompraItemInfo)Util.DataRowToEntidad(dataRow, new OrdenCompraItemInfo().GetType());

                item.SetTotales(cantidad.ToDecimal().Value,
                                precioIGV.ToDecimal().Value,
                                precioNOIGV.ToDecimal().Value,
                                subMontoIGV.ToDecimal().Value,
                                subMonto.ToDecimal().Value,
                                IGVvalor,
                                IGVCheckBox.Checked);



                Util.EntidadUpdateDataRow(item, dataRow);

                Session[idobjectdsLabel.Value.ToString()] = lista;

                itemGridView.EditIndex = -1;
                BindDataitem();
                SetTotales();

            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }

        }

        private void BindDataitem()
        {


            DataSet recursoList = (DataSet)Session[idobjectdsLabel.Value];

            int total = itemGridView.Columns.Count;
            if (comparativoDDL.SelectedValue.ToInt() == 0)
                itemGridView.Columns[total - 2].Visible = false;
            else
                itemGridView.Columns[total - 2].Visible = true;

            //caso de incluido el IGV
            if (IGVCheckBox.Checked)
            {
                itemGridView.Columns[4].Visible = false; //PRECIO NO igv
                itemGridView.Columns[6].Visible = false;

                itemGridView.Columns[5].Visible = true; //igv  precio incl
                itemGridView.Columns[7].Visible = true;
            }
            else
            {
                itemGridView.Columns[4].Visible = true;
                itemGridView.Columns[6].Visible = true;

                itemGridView.Columns[5].Visible = false;
                itemGridView.Columns[7].Visible = false;
            }
            itemGridView.DataSource = recursoList.Tables[ORDENCOMPRAITEMINFO]; ;

            if (comparativoDDL.SelectedValue.ToInt() == 0)
                itemGridView.ShowFooter = true;
            else
                itemGridView.ShowFooter = false;




            comparativoDDL.Enabled = true;
            var w = recursoList.Tables[ORDENCOMPRAITEMINFO].AsEnumerable().
                            Where(p => p.RowState != DataRowState.Deleted).Count();
            if (w > 0)
            {
                comparativoDDL.Enabled = false;
            }
            itemGridView.DataBind();
            resetEmpty();
            itemUpdatePanel.Update();


        }

        #endregion




        protected void AddRecursos_Click(object sender, EventArgs e)
        {
            try
            {

                DataSet recursoList = (DataSet)Session[idobjectdsLabel.Value];


                List<int> Yautilizado = recursoList.Tables[ORDENCOMPRAITEMINFO].AsEnumerable().
                                        Where(p => p.RowState != DataRowState.Deleted).
                                        Select(p => p.Field<int>("idComparativoItemSelecPrv")).ToList();


                List<int> ListOrdenCompraEliminados = new List<int>();
                DataSet dsDiferencias = new DataSet();

                if (recursoList.HasChanges())
                {
                    dsDiferencias.Merge(recursoList.GetChanges());

                    foreach (DataRow drw in dsDiferencias.Tables[ORDENCOMPRAITEMINFO].Rows)
                    {
                        if (drw.RowState == DataRowState.Deleted)
                        {
                            drw.RejectChanges();

                            ListOrdenCompraEliminados.Add(drw.Field<int>("idInternal"));
                        }
                    }
                }



                ComparativoItemSeleccionPanel1.LoadRecurso(bol,
                                                        idComparativo.Value.ToInt(),
                                                        IGVvalorLabel.Text.ToDecimal().Value,
                                                        IGVCheckBox.Checked,
                                                        idComparativoProveedor.Value.ToInt(),
                                                        Yautilizado,
                                                        ListOrdenCompraEliminados);
                ModalAddPopupExtender.Show();

            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
        }

        protected void AddRecurso(object sender, EventArgs e)
        {
            try
            {
                List<OrdenCompraItemInfo> listaItem = ComparativoItemSeleccionPanel1.ItemLista;
                DataSet ds = (DataSet)Session[idobjectdsLabel.Value];

                foreach (var item in listaItem)
                {

                    ds.Tables[ORDENCOMPRAITEMINFO].ImportRow(Util.EntidadToDataRow(item));
                }
                Session[idobjectdsLabel.Value] = ds;
                BindDataitem();
                ModalAddPopupExtender.Hide();
                SetTotales();

            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }


        }
        private void LoadComparativo(int idComparativo)
        {
            // carga desde comparativo

            emisorLabel.Text = ((String)Session["login.Empleado.descripcion"]).ToUpper();



            OrdenCompraBL bl = new OrdenCompraBL();

            OrdenCompraInsertInfo ordenCompra = bl.loadOrdenCompraFromComparativo(idComparativo);
            simbol.Value = DbUtil.Db.Monedas.Single(p => p.idInternal == ordenCompra.idMoneda).simbol;

            // idProveedor.Value = ordenCompra.idProveedor.ToString();
            idObra.Value = ordenCompra.idObra.ToString();
            idproveedorTXT.Text = ordenCompra.idProveedor.ToString();
            ProveedorTXT.Text = ordenCompra.proveedor;
            Proveedor1TXT.Text = ordenCompra.proveedor;
            rucTXT.Text = ordenCompra.proveedor;
            contactoTXT.Text = ordenCompra.contacProveedor;
            tipoCambioLabel.Text = Convert.ToString(ordenCompra.tipoCambio);

            comparativoDDL.SelectedValue = ordenCompra.idComparativo.ToString();
            monedaDDL.SelectedValue = ordenCompra.idMoneda.ToString();


            formaPagoDDL.SelectedValue = ordenCompra.idFormaPago.ToString();
            tipoCambioLabel.Text = ordenCompra.tipoCambio.ToString();
            idproveedorTXT.Text = ordenCompra.idProveedor.ToString();
            idComparativoProveedor.Value = ordenCompra.idComparativoProveedor.ToString();
            numDocumentoLabel.Text = ordenCompra.numDocumento;
            //fechaContratoTextBox.Text = ordenCompra.fechaComparativo.ToShortDateString();
            //carga en los controles ds
            //idproveedor seleccionado es quien figura en comparativoproveedor id

            contactoTXT.Text = ordenCompra.contacProveedor;
            SaldoComparativoLabel.Text = ordenCompra.saldoComparativo;
            centroCostoLabel.Text = ordenCompra.centroCosto;
            estructuraDDL.SelectedValue = ordenCompra.idEstructura.ToString();


            comparativoLinkButton.Text = ordenCompra.desComparativo;
            comparativoLinkButton.NavigateUrl =
                String.Format("../Comparativos/ComparativoReadForm.aspx?idObra={0}&id={1}",
                int.Parse(idObra.Value),
                ordenCompra.idComparativo.ToString());
            int idEmpleado = ((int)Session["idEmpleado"]);
            numDocumentoLabel.Enabled = false;
            if (idEmpleado == 32)
            {
                numDocumentoLabel.Enabled = true;
            }



            DataTable empleadoObraList = Util.EntidadToDataTable(bol.getOrdenCompraItem(DbUtil.Db, internalid.Value.ToInt()));
            DataSet ds = new DataSet();




            empleadoObraList.TableName = ORDENCOMPRAITEMINFO;


            ds.Tables.Add(empleadoObraList);
            ds.AcceptChanges();

            Session[idobjectdsLabel.Value] = ds;


        }

        private void loadCombo()
        {
            if (comparativoDDL.SelectedValue != "0")
            {
                LoadComparativo(int.Parse(comparativoDDL.SelectedValue));
                BindDataitem();
                Activarcontrol(false);
                SetTotales();
                AddRecursos.Visible = true;
            }
            else
            {
                ClearControl();
                Activarcontrol(true);
                BindDataitem();
                SetTotales();
                AddRecursos.Visible = false;
            }
        }
        protected void comparativoDDL_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {


                if (((DropDownList)sender).Items.Count > 0)
                {
                    idComparativo.Value = ((DropDownList)sender).SelectedValue;
                    loadCombo();
                }


            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
        }


        protected void monedaDDL_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {


                if (((DropDownList)sender).Items.Count > 0)
                {
                    string idMoenda = ((DropDownList)sender).SelectedValue;
                    simbol.Value = DbUtil.Db.Monedas.Single(p => p.idInternal == idMoenda.ToInt()).simbol;
                    SetTotales();

                }


            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
        }

        protected void tipoGastoDDL_SelectChanged(object sender, EventArgs e)
        {
            //opciones
            //para guardar el gasto de obra
            //segun tipo de gasto



            calcularIGVLabel.Visible = false;
            CalcularIGVCheckBox.Visible = false;

            switch (tipoGastoDropDown.SelectedValue)
            {
                case "2":
                    rendicionCHPNL.Visible = false;

                    calcularIGVLabel.Visible = true;
                    CalcularIGVCheckBox.Visible = true;

                    cajachicapanelUpdate.Update();
                    SetTotales();

                    break;
                case "3":
                    rendicionCHPNL.Visible = false;

                    calcularIGVLabel.Visible = false;
                    CalcularIGVCheckBox.Checked = false;

                    cajachicapanelUpdate.Update();
                    SetTotales();


                    break;
                case "4":
                    rendicionCHPNL.Visible = false;

                    calcularIGVLabel.Visible = false;
                    CalcularIGVCheckBox.Checked = false;
                    cajachicapanelUpdate.Update();
                    SetTotales();
                    break;
                case "5":
                    rendicionCHPNL.Visible = true;


                    if (cajaChicaDDL.SelectedValue.ToInt() > 0)
                    {
                        LoadCajaChica(cajaChicaDDL.SelectedValue.ToInt());
                    }

                    cajachicapanelUpdate.Update();
                    SetTotales();
                    break;



                default:
                    break;
            }

            panelTotal.Update();
        }

        protected void CalcularIGVCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            SetTotales();

            //if (CalcularIGVCheckBox.Checked)
            //{
            //    ////recorriendo la lista de Insumos 
            //    //OrdenCompraItemInfo recurso = new OrdenCompraItemInfo();

            //    //List<OrdenCompraItemInfo> recursoList =
            //    //    (List<OrdenCompraItemInfo>)Session[idobjectdsLabel.Value.ToString()];

            //    //foreach (var item in recursoList)
            //    //{
            //    //    colocamos el IGV

            //    //}

            //}
            //else
            //{

            //}
        }

        protected void LinkButton1_Click(object sender, EventArgs e)
        {

        }

        protected void cajaChicaDDL_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (cajaChicaDDL.SelectedValue.ToInt() > 0)
                {
                    LoadCajaChica(cajaChicaDDL.SelectedValue.ToInt());
                }
                cajachicapanelUpdate.Update();
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }


        }
        private void LoadCajaChica(int idRendicion)
        {
            Rendicion rendicion = DbUtil.Db.Rendicions.Single(p => p.idInternal == idRendicion);
            cajaChicaLinkButton.NavigateUrl =
               String.Format("../RendicionCaja/RendicionEditForm.aspx?idObra={0}&id={1}",
               int.Parse(idObra.Value), idRendicion.ToString());
            cajaChicaLinkButton.Text = rendicion.descripcion;
            totalCajaChicalLabel.Text = rendicion.RendicionItems.Sum(p => p.total).ToString("N");


        }

    }
}